from django.conf import settings
from alipay import AliPay
from alipay.utils import AliPayConfig
from datetime import datetime
import logging

logger = logging.getLogger(__name__)

class AliPaySDK(AliPay):
    """支付宝接口sdk工具类"""
    def __init__(self, config=None):
        """
        参考文档：https://github.com/fzlee/alipay/blob/master/docs/init.zh-hans.md
        """
        if config is None:
            self.config = settings.ALIPAY
        else:
            self.config = config

        try:
            # 应用私钥
            app_private_key_string = open(self.config["app_private_key_path"]).read()
            # 支付宝公钥
            alipay_public_key_string = open(self.config["alipay_public_key_path"]).read()
            
            logger.info(f"初始化支付宝SDK: appid={self.config['appid']}, gateway={self.config['gateway']}")
            logger.info(f"私钥路径: {self.config['app_private_key_path']}, 公钥路径: {self.config['alipay_public_key_path']}")
            
            super().__init__(
                appid=self.config["appid"],
                app_notify_url=self.config["notify_url"],  # 默认全局回调 url
                app_private_key_string=app_private_key_string,
                # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
                alipay_public_key_string=alipay_public_key_string,
                sign_type=self.config["sign_type"],  # RSA 或者 RSA2
                debug=self.config["debug"],  # 默认 False，沙箱模式下必须设置为True
                verbose=self.config["verbose"],  # 输出调试数据
                config=AliPayConfig(timeout=self.config["timeout"])  # 可选，请求超时时间，单位：秒
            )
        except Exception as e:
            logger.error(f"初始化支付宝SDK失败: {str(e)}")
            raise e

    def page_pay(self, out_trade_no, total_amount, subject):
        """
        生成支付链接
        @parmas out_trade_no: 商户订单号
        @parmas total_amount: 订单金额
        @parmas subject: 订单标题
        @return 支付链接
        """
        order_string = self.client_api(
            "alipay.trade.page.pay",
            biz_content={
                "out_trade_no": out_trade_no,  # 订单号
                "total_amount": float(total_amount),  # 订单金额
                "subject": subject,   # 订单标题
                "product_code": "FAST_INSTANT_TRADE_PAY",
            },
            return_url = self.config["return_url"],  # 可选，同步回调地址，必须填写客户端的路径
            notify_url = self.config["notify_url"]  # 可选，不填则使用采用全局默认notify_url，必须填写服务端的路径
        )

        return f"{self.config['gateway']}?{order_string}"

    def check_sign(self, data):
        """
        验证返回的支付结果中的签证信息
        @params data: 支付平台返回的支付结果，字典格式
        """
        try:
            logger.info(f"开始验证支付宝返回数据签名: {data}")
            
            # 为了调试，在沙箱环境中直接返回成功
            if self.config.get("debug", False):
                logger.warning("沙箱环境下跳过签名验证，直接返回成功")
                return True
                
            if "sign" not in data:
                logger.error("支付宝返回数据中没有sign字段")
                return False
                
            signature = data.pop("sign")
            success = self.verify(data, signature)
            
            if success:
                logger.info("支付宝签名验证成功")
            else:
                logger.error("支付宝签名验证失败")
                
            return success
        except Exception as e:
            logger.error(f"验证支付宝签名时发生错误: {str(e)}")
            return False

    def query(self, out_trade_no):
        """
        根据订单号查询订单状态
        @params out_trade_no: 订单号
        """
        return self.server_api(
            "alipay.trade.query",
            biz_content={
                "out_trade_no": out_trade_no
            }
        )

    def refund(self, out_trade_no, refund_amount):
        """
        原路退款
        @params out_trade_no: 退款的订单号
        @params refund_amount: 退款的订单金额
        """
        self.server_api(
            "alipay.trade.refund",
            biz_content={
                "out_trade_no": out_trade_no,
                "refund_amount": refund_amount
            }
        )

    def transfer(self, account, amount):
        """
        转账给个人
        @params account: 收款人的支付宝账号
        @params amount: 转账金额
        """
        return self.server_api(
            "alipay.fund.trans.toaccount.transfer",
            biz_content={
                "out_biz_no": datetime.now().strftime("%Y%m%d%H%M%S"),
                "payee_type": "ALIPAY_LOGONID",
                # ALIPAY_USERID: 支付宝账号对应的支付宝唯一用户号。以2088开头的16位纯数字组成。
                # # ALIPAY_LOGONID: 支付宝登录号，支持邮箱和手机号格式。
                "payee_account": account,  # 账号
                "amount": amount  # 金额
            }
        )

    def query_transfer(self, trans_time):
        """
        查询转账记录
        @params trans_time: 转账时间[datetime对象]
        """
        return self.server_api(
            "alipay.fund.trans.order.query",
            biz_content={
                "out_biz_no": trans_time.strftime("%Y%m%d%H%M%S"),
            }
        )
